Skip to main content
Version: 2021_2

Parte 3 (2 horas)

En esta parte y la siguiente vamos a implementar lexers para los 4 lenguajes planteados anteriormente. En la carpeta parte3 se encuentran los siguientes elementos importantes:

  • LanguageAutomata.java: Una interfaz que se usa para representar toda la informaci贸n necesaria para expresar una aut贸mata capaz de parsear un lenguaje:
    • Funci贸n de transici贸n

    • Funci贸n que dice si un estado es final

    • Funci贸n que dice cu谩l es el estado "muerto", que es el que no tiene transiciones salientes.

    • otras cosas necesarias para definir el aut贸mata

      La interfaz tiene 2 tipos gen茅ricos. El tipo S es el tipo de los estados, y T representa los tipos de token. As铆, la interfaz nos permite cambiar los tipos enumerados que se usan en el lenguaje.

  • ManualLexer.java: A partir de un aut贸mata que implementa LanguageAutomata, implementa un algoritmo que convierte strings en tokens "observando" el comportamiento de la funci贸n de transici贸n. Expone 2 m茅todos, que deben completarse como parte del alcance de este laboratorio:
    • extractToken(String program) avanza por el String recibido como par谩metro hasta alcanzar un estado muerto del aut贸mata. Entonces devuelve el token correspondiente al 煤ltimo estado final, y la posici贸n del 煤ltimo caracter donde se lo alcanz贸.
    • lex(String program) Llama constantemente a extractToken(), hasta consumir la totalidad del programa.
  • Carpeta BrainfuckAdder: Contiene el aut贸mata y los tipos enumerados correspondientes a ese lenguage.

Por otra parte, en la carpeta de nombre parte3 dentro de test se encuentra ManualLexerTest, que usa la implementaci贸n de BrainfuckAdder inclu铆da para testear ManualLexer.

Consigna#

Completar ManualLexer.java de forma que pasen los tests en ManualLexerTest.java. Se recomienda iniciar por los tests de extractToken y luego continuar con los de lex. No se permite modificar los tests de ManualLexerTest.java, si se considera necesario agregar m谩s pruebas, crear un archivo con pruebas adicionales.

Consejos#

  1. Hacer pasar primero los tests que eval煤an la funci贸n extractToken, y luego pasar a los tests de lex.
  2. En el texto tiger, secci贸n 2.3, subt铆tulo RECOGNIZING THE LONGEST MATCH se describe el algoritmo que "observa" al aut贸mata. No incluye una descripci贸n formal del pseudoc贸digo.

pseudoc贸digo#

Se propone a continuaci贸n un pseudoc贸digo aproximado de los m茅todos a completar como parte de la consigna. No copiarlo tal cual ya que se excluyeron detalles importantes tales como 铆ndices, excepciones, algunas variables, etc.

extractToken(programa){    estadoActual= ESTADO_INICIAL    ultimoEstadoFinal=ninguno    for(cada caracter del programa){        estadoActual= TRANSCICION(estadoActual,caracter)        if(ES_FINAL(estadoActual)){            ultimoEstadoFinal=estadoActual        }        if(estadoActual=ESTADO_MUERTO){            return ultimoEstadoFinal, posfinal        }    }}
lex(programa){    tokens=[]    while(programa no est谩 vac铆o){        token = extractToken(programa)        programa = programa sin los caracteres del token        tokens.agregar( token )    }}